<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // Promise的静态方法 => 构造函数Promise自己的方法
    // console.dir(Promise)

    // Promise.all()   Promise.all()方法用于将多个 Promise 实例，包装成一个新的 Promise 实例。
    // const p = Promise.all([p1, p2, p3]);
    // 上面代码中，Promise.all()方法接受一个数组作为参数，p1、p2、p3都是 Promise 实例，如果不是，就会先调用下面讲到的Promise.resolve方法，将参数转为 Promise 实例，
    // p的状态由p1、p2、p3决定，分成两种情况。
    // （1）只有p1、p2、p3的状态都变成fulfilled，p的状态才会变成fulfilled，此时p1、p2、p3的返回值组成一个数组，传递给p的回调函数。
    // （2）只要p1、p2、p3之中有一个被rejected，p的状态就变成rejected，此时第一个被reject的实例的返回值，会传递给p的回调函数。
    //  处理多请求同时发送  => 按顺序返回结果,结果放到数组中


    // Promise.race()   Promise.race()方法用于将多个 Promise 实例，包装成一个新的 Promise 实例。
    // const p = Promise.all([p1, p2, p3]);
    // 只要p1、p2、p3之中有一个实例率先改变状态(成功/失败都可以)，p的状态就跟着改变。那个率先改变的 Promise 实例的返回值，就传递给p的回调函数。
    // Promise.race()   => 依赖于p1、p2、p3之中率先改变状态的实例


    // Promise.any()   Promise.any()方法用于将多个 Promise 实例，包装成一个新的 Promise 实例。
    // const p = Promise.any([p1, p2, p3]);
    // 只要参数实例有一个变成fulfilled状态，包装实例就会变成fulfilled状态；如果所有参数实例都变成rejected状态，包装实例就会变成rejected状态。
    
    // Promise.allSettled()   Promise.allSettled()方法用于将多个 Promise 实例，包装成一个新的 Promise 实例。 (ES2020 引入了Promise.allSettled()方法，用来确定一组异步操作是否都结束了（不管成功或失败）)
    // const p = Promise.any([p1, p2, p3]);
    // Promise.allSettled()方法接受一个数组作为参数，数组的每个成员都是一个 Promise 对象，并返回一个新的 Promise 对象。只有等到参数数组的所有 Promise 对象都发生状态变更（不管是fulfilled还是rejected），返回的 Promise 对象才会发生状态变更。
    // [
    //    { status: 'fulfilled', value: 42 },
    //    { status: 'rejected', reason: -1 }
    // ]


    // 小结
    // Promise.all()   => 全都成功才成功,有一个失败就失败
    // Promise.race()  => 只找最快的,不管时成功还是失败
    // Promise.any()   => 只找成功的,这个不成功下一个还有可能
    // Promise.allSettled()   => 只等异步操作结束(一组),不管每一个是成功/失败


    // Promise.resolve()  传入一个参数,将其转化为Promise实例(成功状态的)  => 根据传入的数据,快速返回一个Promise实例
    // 1. 如果传入的参数,不是Promise实例, => 默认返回成功状态的Promise实例,传入的数据作为Promise实例的数据存储
    // 2. 如果传入的参数,是Promise实例  =>  直接返回该Promise实例


    // Promise.myResolve = function(arg){
    //     if(Object.prototype.toString.call(arg) == "[object Promise]"){
    //         return arg;
    //     }else{
    //         return new Promise(function(resolve,reject){
    //             resolve(arg);
    //         });
    //     }
    // }


    // Promise.reject()  传入一个参数,将其转化为Promise实例(失败状态的)  => 根据传入的数据,快速返回一个Promise实例
    Promise.reject = function(arg){
        return new Promise(function(resolve,reject){
            reject(arg); // {<rejected>:arg}
        });
    }


    // var p = Promise.reject(1);  //  {<rejected>:1}
    // console.log(p);

    var p = new Promise(function(resolve,reject){
        resolve(1);
    });
    // console.log(p); // {<fulfilled>:1}

    var p1 = Promise.reject(p); // {<rejected>:p}
    console.log(p1);


  

   




</script>

</html>